package com.zkingsoft.rhi.jwt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.DefaultClaims;
import org.apache.commons.lang.StringUtils;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xieguo
 * @since 2020/11/5 9:11
 */



public class Jwt {

    //字符串要大于四位
    private static final String aesKey="revolution-heritage-info";

    public static String BuildJwtString(String userId,String userName){
        //签名算法，选择SHA-256
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//这个类在io.jsonwebtoken.*; 别导错了
        //添加构成JWT的参数,入参前面有介绍
        Map<String, Object> headMap = new HashMap<String,Object>();

        headMap.put("alg", SignatureAlgorithm.HS256.getValue());//就是HS256
        headMap.put("typ", "JWT");
        //将常量字符串使用base64解码成字节数组
        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(aesKey);

        //使用HmacSHA256签名算法生成一个HS256的签名秘钥Key
        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

        //创建builder
        JwtBuilder jwtBuilder= Jwts.builder().setHeader(headMap).claim("userId",userId)
                .claim("userName",userName)
                //指定签名的算法和秘钥
                .signWith(signatureAlgorithm,signingKey);
        //如果需要设置过期时间
        long nowTimeMills=System.currentTimeMillis();//获取当前时间
        long expires_time=nowTimeMills+1000*60*60*24;//一天后过期
        Date date = new Date(expires_time);
        jwtBuilder.setExpiration(date);
        //返回创建好的jwt字符串
        return jwtBuilder.compact();
    }

    //解析jwt，返回Claims，可根据key获取载荷信息
    public static Claims parseJwt(String jwtString){
        try {
            Claims claims = null;//获取有效载荷中数据
            if(StringUtils.isNotEmpty(jwtString)){
                claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(aesKey))
                        .parseClaimsJws(jwtString).getBody();
            }

            return claims;
        }catch (Exception e){
            return new DefaultClaims();
        }
    }
}

